source('~/Google Drive/work_analysis/policestat/policestat_reporting/src/biweekly_reporting.R', echo=TRUE)
> library(tidyverse)
> library(RSocrata)
> library(RcppRoll)
> library(ggiteam)
> library(scales)
> library(lubridate)
> library(rgdal)
> library(leaflet)
> library(RODBC)
> library(htmltools)
> library(readxl)
> source("src/functions.R")
cannot open file 'src/functions.R': No such file or directoryError in file(filename, "r", encoding = encoding) :
cannot open the connection
library(tidyverse)
violent_crime <- get_violent_crime_socrata()
rolling_counts_by_district <- get_rolling_counts_by_district(violent_crime)
rolling_counts_citywide <- get_rolling_counts_citywide(violent_crime)
rolling_counts_citywide %>%
ggplot(aes(crimedate, roll_90, color = description)) +
geom_line()

deseasoned_homicides_shootings_historical <- rolling_counts_citywide %>%
filter(description == "HOMICIDE + SHOOTING",
!is.na(roll_90),
crimedate >= "2016-01-01",
crimedate <= "2019-12-31") %>%
select(crimedate, roll_90) %>%
mutate(crimedate.year = year(crimedate)) %>%
group_by(crimedate.year) %>%
mutate(year_avg = mean(roll_90)) %>%
ungroup() %>%
mutate(seasonal_ratio = roll_90 / year_avg,
day_of_year = yday(crimedate)) %>%
group_by(day_of_year) %>%
mutate(
seasonal_act_avg = mean(roll_90),
seasonal_ratio_avg = mean(seasonal_ratio)) %>%
ungroup()
deseasoned_homicides_shootings_w_this_year <- rolling_counts_citywide %>%
filter(description == "HOMICIDE + SHOOTING",
year(crimedate) >= 2016) %>%
mutate(day_of_year = yday(crimedate)) %>%
left_join(
deseasoned_homicides_shootings_historical %>%
filter(crimedate.year == 2016) %>%
select(day_of_year,
seasonal_ratio,
seasonal_act_avg,
seasonal_ratio_avg),
by = "day_of_year"
) %>%
mutate(deseasoned_90d = roll_90 / seasonal_ratio_avg)
deseasoned_homicides_shootings_w_this_year %>%
select(crimedate, roll_90, seasonal_act_avg, deseasoned_90d) %>%
gather(key = type, value = total_90, -crimedate) %>%
#filter(crimedate >= max(crimedate) - 3 * 365) %>%
filter(type != "deseasoned_90d") %>%
ggplot(aes(crimedate, total_90, color = type)) +
geom_line(size = .7) +
#facet_grid(rows = vars(type)) +
scale_x_date(date_minor_breaks = "3 month",
date_breaks = "1 year",
date_labels = "%b\n%y",
limits = c(as.Date("2016-01-01"), as.Date("2020-08-01"))
) +
theme_iteam_presentations() +
#
#scale_color_discrete_iteam() +
scale_color_manual(values = c(iteam.colors[2], iteam.colors[3])) +
theme(axis.title.x = element_blank(),
panel.grid.major.x = element_line(color="gray40"),
panel.grid.minor.x = element_line(color = "gray70")) +
labs(y = "90-Day Homicide + Shooting Total",
title = "90-Day Total Homicides and Shootings",
subtitle = "Actual and 2016-2019 Seasonal Average")

deseasoned_homicides_shootings_w_this_year %>%
select(crimedate, roll_90, seasonal_act_avg, deseasoned_90d) %>%
gather(key = type, value = total_90, -crimedate) %>%
#filter(crimedate >= max(crimedate) - 3 * 365) %>%
#filter(type != "deseasoned_90d") %>%
ggplot(aes(crimedate, total_90, color = type)) +
geom_line(size = .7) +
facet_grid(rows = vars(type)) +
scale_x_date(date_minor_breaks = "3 month",
date_breaks = "1 year",
date_labels = "%b\n%y",
limits = c(as.Date("2016-01-01"), as.Date("2020-08-01"))
) +
theme_iteam_presentations() +
scale_color_discrete_iteam() +
theme(axis.title.x = element_blank(),
panel.grid.major.x = element_line(color="gray40"),
panel.grid.minor.x = element_line(color = "gray70")) +
labs(y = "90-Day Homicide + Shooting Total")+
labs(y = "90-Day Homicide + Shooting Total",
title = "90-Day Total Homicides and Shootings",
subtitle = "Seasonally Adjusted, Actual, and 2016-2019 Seasonal Average")

deseasoned_homicides_shootings_historical %>%
select(crimedate, seasonal_ratio) %>%
#filter(crimedate >= max(crimedate) - 3 * 365) %>%
#filter(type != "deseasoned_90d") %>%
ggplot(aes(crimedate, seasonal_ratio)) +
geom_line(size = .7, color = iteam.colors[3]) +
#facet_grid(rows = vars(type), scales = "free_y") +
scale_x_date(date_minor_breaks = "3 month",
date_breaks = "1 year",
date_labels = "%b\n%y",
limits = c(as.Date("2016-01-01"), as.Date("2020-08-01"))
) +
theme_iteam_presentations() +
scale_color_discrete_iteam() +
theme(axis.title.x = element_blank(),
panel.grid.major.x = element_line(color="gray40"),
panel.grid.minor.x = element_line(color = "gray70"))

deseasoned_all_citywide <- deseason_rolling_90d_counts(rolling_counts_citywide)
deseasoned_all_by_district <- deseason_rolling_90d_counts(rolling_counts_by_district)
deseasoned_all_citywide %>%
filter(description %in% c("AGG. ASSAULT", "RAPE", "HOMICIDE + SHOOTING", "ROBBERY (ALL)")) %>%
ggplot(aes(crimedate)) +
geom_rect(aes(xmin=md_stay_at_home_start, xmax=md_stay_at_home_end, ymin=0, ymax=Inf),
fill = "gray90", alpha = 0.5) +
geom_line(aes(y=deseasoned_90d, color = description)) +
geom_point(data = . %>%
filter(crimedate == max(crimedate) - 365),
aes(x = crimedate, y = deseasoned_90d),
color = iteam.colors[1], size = 3) +
geom_point(data = . %>%
filter(crimedate == max(crimedate)),
aes(x = crimedate, y = deseasoned_90d),
color = red_orange, size = 3) +
facet_wrap(ncol = 1, ~description, scales="free_y") +
theme_iteam_presentations() +
scale_color_discrete_iteam() +
theme(legend.position = "none",
axis.title.x = element_blank(),
panel.grid.major.x = element_line(color = "gray90")) +
labs(title = "Seasonally Adjusted 90-Day Crime Trends") +
labs(y = "90 Day Rolling Total")

deseasoned_all_citywide %>%
filter(grepl("ROBBERY", description),
description != "ROBBERY (ALL)",
crimedate >= "2019-01-01") %>%
ggplot(aes(crimedate)) +
geom_rect(aes(xmin=md_stay_at_home_start, xmax=md_stay_at_home_end, ymin=0, ymax=Inf),
fill = "gray90", alpha = 0.5) +
geom_line(aes(y=deseasoned_90d, color = description)) +
geom_point(data = . %>%
filter(crimedate == max(crimedate) - 365),
aes(x = crimedate, y = deseasoned_90d),
color = iteam.colors[1], size = 3) +
geom_point(data = . %>%
filter(crimedate == max(crimedate)),
aes(x = crimedate, y = roll_90),
color = red_orange, size = 3) +
facet_wrap(ncol = 1, ~description, scales="free_y") +
theme_iteam_presentations() +
theme(legend.position = "none",
axis.title.x = element_blank(),
panel.grid.major.x = element_line(color = "gray90")) +
scale_color_discrete_iteam() +
scale_x_date(date_breaks = "1 year", date_labels = format("%Y"),
date_minor_breaks = "1 month") +
#labs(title = "Actual 90-Day Crime Trends") +
labs(y = "90 Day Rolling Total")

deseasoned_all_citywide %>%
filter(grepl("ROBBERY", description),
description != "ROBBERY (ALL)",
crimedate >= "2019-01-01") %>%
ggplot(aes(crimedate)) +
geom_rect(aes(xmin=md_stay_at_home_start, xmax=md_stay_at_home_end, ymin=0, ymax=Inf),
fill = "gray90", alpha = 0.5) +
geom_line(aes(y=roll_90, color = description)) +
geom_point(data = . %>%
filter(crimedate == max(crimedate) - 365),
aes(x = crimedate, y = roll_90),
color = iteam.colors[1], size = 3) +
geom_point(data = . %>%
filter(crimedate == max(crimedate)),
aes(x = crimedate, y = roll_90),
color = red_orange, size = 3) +
facet_wrap(ncol = 1, ~description, scales="free_y") +
theme_iteam_presentations() +
theme(legend.position = "none",
axis.title.x = element_blank(),
panel.grid.major.x = element_line(color = "gray90")) +
scale_color_discrete_iteam() +
scale_x_date(date_breaks = "1 year", date_labels = format("%Y"),
date_minor_breaks = "1 month") +
#labs(title = "Actual 90-Day Crime Trends") +
labs(y = "90 Day Rolling Total")

deseasoned_all_citywide %>%
filter(grepl("ROBBERY", description),
description != "ROBBERY (ALL)",
crimedate >= "2019-01-01") %>%
ggplot(aes(crimedate)) +
geom_rect(aes(xmin=md_stay_at_home_start, xmax=md_stay_at_home_end, ymin=0, ymax=Inf),
fill = "gray90", alpha = 0.5) +
geom_line(aes(y=roll_90, color = description),
size = 1.) +
#facet_wrap(ncol = 1, ~description) +
ylim(c(0, 1200)) +
theme_iteam_presentations() +
scale_color_discrete_iteam() +
theme(legend.title = element_blank(),
legend.position = "right",
axis.title.x = element_blank(),
panel.grid.major.x = element_line(color = "gray70"),
panel.grid.minor.x = element_line(color = "gray90")) +
#labs(title = "Seasonally Adjusted 90-Day Crime Trends") +
labs(y = "90 Day Rolling Total") +
scale_x_date(date_breaks = "1 year", date_labels = format("%Y"),
date_minor_breaks = "1 month")

# THIS ONE SHOULD BE THE FUNCTION
deseasoned_all_by_district %>%
filter(#description == "HOMICIDE + SHOOTING",
crimedate >= "2019-01-01") %>%
ggplot(aes(crimedate)) +
geom_rect(aes(xmin=md_stay_at_home_start, xmax=md_stay_at_home_end, ymin=0, ymax=Inf),
fill = "gray90", alpha = 0.5) +
geom_line(aes(y=deseasoned_90d), color = iteam.colors[2]) +
geom_point(data = . %>%
filter(crimedate == max(crimedate) - 365),
aes(x = crimedate, y = deseasoned_90d),
color = iteam.colors[1], size = 3) +
geom_point(data = . %>%
filter(crimedate == max(crimedate)),
aes(x = crimedate, y = deseasoned_90d),
color = red_orange, size = 3) +
facet_wrap( ~description + district, scales = "free_y") +
theme_iteam_presentations() +
#scale_color_discrete_iteam() +
theme(legend.position = "none",
axis.title.x = element_blank(),
panel.grid.major.x = element_line(color = "gray90"),
panel.grid.minor.x = element_blank()) +
labs(title = "Seasonally Adjusted 90-Day Crime Trends") +
labs(y = "90 Day Rolling Total") +
scale_x_date(date_breaks = "1 year", date_labels = format("%Y"),
date_minor_breaks = "1 month")
source('~/Google Drive/work_analysis/policestat/policestat_reporting/src/biweekly_reporting.R', echo=TRUE)
> library(tidyverse)
> library(RSocrata)
> library(RcppRoll)
> library(ggiteam)
> library(scales)
> library(lubridate)
> library(rgdal)
> library(leaflet)
> library(RODBC)
> library(htmltools)
> library(readxl)
> source("src/functions.R")
Error in file(filename, "r", encoding = encoding) :
cannot open the connection

deseasoned_all_citywide %>%
filter(description == "HOMICIDE + SHOOTING")
LS0tCnRpdGxlOiAiRGVzZWFzb25pbmcgQ3JpbWUiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoUmNwcFJvbGwpCmxpYnJhcnkoZ2dpdGVhbSkKc291cmNlKCIuLi9zcmMvZnVuY3Rpb25zLlIiKQoKcmVkX29yYW5nZSA8LSAiI2YwNWEyOCIKYGBgCgpgYGB7cn0KdmlvbGVudF9jcmltZSA8LSBnZXRfdmlvbGVudF9jcmltZV9zb2NyYXRhKCkKYGBgCgpgYGB7cn0Kcm9sbGluZ19jb3VudHNfYnlfZGlzdHJpY3QgPC0gZ2V0X3JvbGxpbmdfY291bnRzX2J5X2Rpc3RyaWN0KHZpb2xlbnRfY3JpbWUpCnJvbGxpbmdfY291bnRzX2NpdHl3aWRlIDwtIGdldF9yb2xsaW5nX2NvdW50c19jaXR5d2lkZSh2aW9sZW50X2NyaW1lKQpgYGAKCmBgYHtyfQpyb2xsaW5nX2NvdW50c19jaXR5d2lkZSAlPiUKICBnZ3Bsb3QoYWVzKGNyaW1lZGF0ZSwgcm9sbF85MCwgY29sb3IgPSBkZXNjcmlwdGlvbikpICsKICBnZW9tX2xpbmUoKQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQgPSA0fQpkZXNlYXNvbmVkX2hvbWljaWRlc19zaG9vdGluZ3NfaGlzdG9yaWNhbCA8LSByb2xsaW5nX2NvdW50c19jaXR5d2lkZSAlPiUKICBmaWx0ZXIoZGVzY3JpcHRpb24gPT0gIkhPTUlDSURFICsgU0hPT1RJTkciLCAKICAgICAgICAgIWlzLm5hKHJvbGxfOTApLAogICAgICAgICBjcmltZWRhdGUgPj0gIjIwMTYtMDEtMDEiLAogICAgICAgICBjcmltZWRhdGUgPD0gIjIwMTktMTItMzEiKSAlPiUKICBzZWxlY3QoY3JpbWVkYXRlLCByb2xsXzkwKSAlPiUKICBtdXRhdGUoY3JpbWVkYXRlLnllYXIgPSB5ZWFyKGNyaW1lZGF0ZSkpICU+JSAKICBncm91cF9ieShjcmltZWRhdGUueWVhcikgJT4lCiAgbXV0YXRlKHllYXJfYXZnID0gbWVhbihyb2xsXzkwKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShzZWFzb25hbF9yYXRpbyA9IHJvbGxfOTAgLyB5ZWFyX2F2ZywKICAgICAgICAgZGF5X29mX3llYXIgPSB5ZGF5KGNyaW1lZGF0ZSkpICU+JQogIGdyb3VwX2J5KGRheV9vZl95ZWFyKSAlPiUKICBtdXRhdGUoCiAgICBzZWFzb25hbF9hY3RfYXZnID0gbWVhbihyb2xsXzkwKSwKICAgIHNlYXNvbmFsX3JhdGlvX2F2ZyA9IG1lYW4oc2Vhc29uYWxfcmF0aW8pKSAlPiUKICB1bmdyb3VwKCkgCgoKZGVzZWFzb25lZF9ob21pY2lkZXNfc2hvb3RpbmdzX3dfdGhpc195ZWFyIDwtIHJvbGxpbmdfY291bnRzX2NpdHl3aWRlICU+JQogIGZpbHRlcihkZXNjcmlwdGlvbiA9PSAiSE9NSUNJREUgKyBTSE9PVElORyIsCiAgICAgICAgIHllYXIoY3JpbWVkYXRlKSA+PSAyMDE2KSAlPiUKICBtdXRhdGUoZGF5X29mX3llYXIgPSB5ZGF5KGNyaW1lZGF0ZSkpICU+JSAKICBsZWZ0X2pvaW4oCiAgICBkZXNlYXNvbmVkX2hvbWljaWRlc19zaG9vdGluZ3NfaGlzdG9yaWNhbCAlPiUKICAgICAgZmlsdGVyKGNyaW1lZGF0ZS55ZWFyID09IDIwMTYpICU+JQogICAgICBzZWxlY3QoZGF5X29mX3llYXIsCiAgICAgICAgICAgICBzZWFzb25hbF9yYXRpbywKICAgICAgICAgICAgIHNlYXNvbmFsX2FjdF9hdmcsCiAgICAgICAgICAgICBzZWFzb25hbF9yYXRpb19hdmcpLAogICAgYnkgPSAiZGF5X29mX3llYXIiCiAgKSAlPiUgCiAgbXV0YXRlKGRlc2Vhc29uZWRfOTBkID0gcm9sbF85MCAvIHNlYXNvbmFsX3JhdGlvX2F2ZykKYGBgCgpgYGB7ciBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gM30KZGVzZWFzb25lZF9ob21pY2lkZXNfc2hvb3RpbmdzX3dfdGhpc195ZWFyICU+JQogIHNlbGVjdChjcmltZWRhdGUsIHJvbGxfOTAsIHNlYXNvbmFsX2FjdF9hdmcsIGRlc2Vhc29uZWRfOTBkKSAlPiUKICBnYXRoZXIoa2V5ID0gdHlwZSwgdmFsdWUgPSB0b3RhbF85MCwgLWNyaW1lZGF0ZSkgJT4lCiAgI2ZpbHRlcihjcmltZWRhdGUgPj0gbWF4KGNyaW1lZGF0ZSkgLSAzICogMzY1KSAlPiUKICBmaWx0ZXIodHlwZSAhPSAiZGVzZWFzb25lZF85MGQiKSAlPiUKICBnZ3Bsb3QoYWVzKGNyaW1lZGF0ZSwgdG90YWxfOTAsIGNvbG9yID0gdHlwZSkpICsKICBnZW9tX2xpbmUoc2l6ZSA9IC43KSArCiAgI2ZhY2V0X2dyaWQocm93cyA9IHZhcnModHlwZSkpICsKICBzY2FsZV94X2RhdGUoZGF0ZV9taW5vcl9icmVha3MgPSAiMyBtb250aCIsCiAgICAgICAgICAgICAgIGRhdGVfYnJlYWtzID0gIjEgeWVhciIsCiAgICAgICAgICAgICAgIGRhdGVfbGFiZWxzID0gIiViXG4leSIsCiAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoYXMuRGF0ZSgiMjAxNi0wMS0wMSIpLCBhcy5EYXRlKCIyMDIwLTA4LTAxIikpCiAgICAgICAgICAgICAgICkgKwogIHRoZW1lX2l0ZWFtX3ByZXNlbnRhdGlvbnMoKSArCiAgIwogICNzY2FsZV9jb2xvcl9kaXNjcmV0ZV9pdGVhbSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhpdGVhbS5jb2xvcnNbMl0sIGl0ZWFtLmNvbG9yc1szXSkpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9saW5lKGNvbG9yPSJncmF5NDAiKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTcwIikpICsKICBsYWJzKHkgPSAiOTAtRGF5IEhvbWljaWRlICsgU2hvb3RpbmcgVG90YWwiLAogICAgICAgdGl0bGUgPSAiOTAtRGF5IFRvdGFsIEhvbWljaWRlcyBhbmQgU2hvb3RpbmdzIiwKICAgICAgIHN1YnRpdGxlID0gIkFjdHVhbCBhbmQgMjAxNi0yMDE5IFNlYXNvbmFsIEF2ZXJhZ2UiKQpgYGAKCgpgYGB7ciBmaWcud2lkdGggPSA2LCBmaWcuaGVpZ2h0ID0gM30KZGVzZWFzb25lZF9ob21pY2lkZXNfc2hvb3RpbmdzX3dfdGhpc195ZWFyICU+JQogIHNlbGVjdChjcmltZWRhdGUsIHJvbGxfOTAsIHNlYXNvbmFsX2FjdF9hdmcsIGRlc2Vhc29uZWRfOTBkKSAlPiUKICBnYXRoZXIoa2V5ID0gdHlwZSwgdmFsdWUgPSB0b3RhbF85MCwgLWNyaW1lZGF0ZSkgJT4lCiAgI2ZpbHRlcihjcmltZWRhdGUgPj0gbWF4KGNyaW1lZGF0ZSkgLSAzICogMzY1KSAlPiUKICAjZmlsdGVyKHR5cGUgIT0gImRlc2Vhc29uZWRfOTBkIikgJT4lCiAgZ2dwbG90KGFlcyhjcmltZWRhdGUsIHRvdGFsXzkwLCBjb2xvciA9IHR5cGUpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAuNykgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnModHlwZSkpICsKICBzY2FsZV94X2RhdGUoZGF0ZV9taW5vcl9icmVha3MgPSAiMyBtb250aCIsCiAgICAgICAgICAgICAgIGRhdGVfYnJlYWtzID0gIjEgeWVhciIsCiAgICAgICAgICAgICAgIGRhdGVfbGFiZWxzID0gIiViXG4leSIsCiAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoYXMuRGF0ZSgiMjAxNi0wMS0wMSIpLCBhcy5EYXRlKCIyMDIwLTA4LTAxIikpCiAgICAgICAgICAgICAgICkgKwogIHRoZW1lX2l0ZWFtX3ByZXNlbnRhdGlvbnMoKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGVfaXRlYW0oKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfbGluZShjb2xvcj0iZ3JheTQwIiksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXk3MCIpKSArCiAgbGFicyh5ID0gIjkwLURheSBIb21pY2lkZSArIFNob290aW5nIFRvdGFsIikrCiAgbGFicyh5ID0gIjkwLURheSBIb21pY2lkZSArIFNob290aW5nIFRvdGFsIiwKICAgICAgIHRpdGxlID0gIjkwLURheSBUb3RhbCBIb21pY2lkZXMgYW5kIFNob290aW5ncyIsCiAgICAgICBzdWJ0aXRsZSA9ICJTZWFzb25hbGx5IEFkanVzdGVkLCBBY3R1YWwsIGFuZCAyMDE2LTIwMTkgU2Vhc29uYWwgQXZlcmFnZSIpCmBgYAoKYGBge3IgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDEuMn0KZGVzZWFzb25lZF9ob21pY2lkZXNfc2hvb3RpbmdzX2hpc3RvcmljYWwgJT4lCiAgc2VsZWN0KGNyaW1lZGF0ZSwgc2Vhc29uYWxfcmF0aW8pICU+JQogICNmaWx0ZXIoY3JpbWVkYXRlID49IG1heChjcmltZWRhdGUpIC0gMyAqIDM2NSkgJT4lCiAgI2ZpbHRlcih0eXBlICE9ICJkZXNlYXNvbmVkXzkwZCIpICU+JQogIGdncGxvdChhZXMoY3JpbWVkYXRlLCBzZWFzb25hbF9yYXRpbykpICsKICBnZW9tX2xpbmUoc2l6ZSA9IC43LCBjb2xvciA9IGl0ZWFtLmNvbG9yc1szXSkgKwogICNmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHR5cGUpLCBzY2FsZXMgPSAiZnJlZV95IikgKwogIHNjYWxlX3hfZGF0ZShkYXRlX21pbm9yX2JyZWFrcyA9ICIzIG1vbnRoIiwKICAgICAgICAgICAgICAgZGF0ZV9icmVha3MgPSAiMSB5ZWFyIiwKICAgICAgICAgICAgICAgZGF0ZV9sYWJlbHMgPSAiJWJcbiV5IiwKICAgICAgICAgICAgICAgbGltaXRzID0gYyhhcy5EYXRlKCIyMDE2LTAxLTAxIiksIGFzLkRhdGUoIjIwMjAtMDgtMDEiKSkKICAgICAgICAgICAgICAgKSArCiAgdGhlbWVfaXRlYW1fcHJlc2VudGF0aW9ucygpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZV9pdGVhbSgpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9saW5lKGNvbG9yPSJncmF5NDAiKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTcwIikpIApgYGAKCmBgYHtyfQpkZXNlYXNvbmVkX2FsbF9jaXR5d2lkZSA8LSBkZXNlYXNvbl9yb2xsaW5nXzkwZF9jb3VudHMocm9sbGluZ19jb3VudHNfY2l0eXdpZGUpCmRlc2Vhc29uZWRfYWxsX2J5X2Rpc3RyaWN0IDwtIGRlc2Vhc29uX3JvbGxpbmdfOTBkX2NvdW50cyhyb2xsaW5nX2NvdW50c19ieV9kaXN0cmljdCkKYGBgCgpgYGB7ciBmaWcud2lkdGggPSAyLjUsIGZpZy5oZWlnaHQgPSAzLCBvdXQuaGVpZ2h0PSIxMDAlIiwgb3V0LmhlaWdodD0iMTAwJSJ9CmRlc2Vhc29uZWRfYWxsX2NpdHl3aWRlICU+JQogIGZpbHRlcihkZXNjcmlwdGlvbiAlaW4lIGMoIkFHRy4gQVNTQVVMVCIsICJSQVBFIiwgIkhPTUlDSURFICsgU0hPT1RJTkciLCAiUk9CQkVSWSAoQUxMKSIpKSAlPiUKICBnZ3Bsb3QoYWVzKGNyaW1lZGF0ZSkpICsKICBnZW9tX3JlY3QoYWVzKHhtaW49bWRfc3RheV9hdF9ob21lX3N0YXJ0LCB4bWF4PW1kX3N0YXlfYXRfaG9tZV9lbmQsIHltaW49MCwgeW1heD1JbmYpLAogICAgICAgICAgICBmaWxsID0gImdyYXk5MCIsIGFscGhhID0gMC41KSArCiAgZ2VvbV9saW5lKGFlcyh5PWRlc2Vhc29uZWRfOTBkLCBjb2xvciA9IGRlc2NyaXB0aW9uKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IC4gJT4lIAogICAgICAgICAgICAgICBmaWx0ZXIoY3JpbWVkYXRlID09IG1heChjcmltZWRhdGUpIC0gMzY1KSwgCiAgICAgICAgICAgICBhZXMoeCA9IGNyaW1lZGF0ZSwgeSA9IGRlc2Vhc29uZWRfOTBkKSwKICAgICAgICAgICAgIGNvbG9yID0gaXRlYW0uY29sb3JzWzFdLCBzaXplID0gMykgKwogIGdlb21fcG9pbnQoZGF0YSA9IC4gJT4lIAogICAgICAgICAgICAgICBmaWx0ZXIoY3JpbWVkYXRlID09IG1heChjcmltZWRhdGUpKSwgCiAgICAgICAgICAgICBhZXMoeCA9IGNyaW1lZGF0ZSwgeSA9IGRlc2Vhc29uZWRfOTBkKSwKICAgICAgICAgICAgIGNvbG9yID0gcmVkX29yYW5nZSwgc2l6ZSA9IDMpICsKICBmYWNldF93cmFwKG5jb2wgPSAxLCB+ZGVzY3JpcHRpb24sIHNjYWxlcz0iZnJlZV95IikgKwogIHRoZW1lX2l0ZWFtX3ByZXNlbnRhdGlvbnMoKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGVfaXRlYW0oKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTkwIikpICsKICBsYWJzKHRpdGxlID0gIlNlYXNvbmFsbHkgQWRqdXN0ZWQgOTAtRGF5IENyaW1lIFRyZW5kcyIpICsKICBsYWJzKHkgPSAiOTAgRGF5IFJvbGxpbmcgVG90YWwiKQpgYGAKCmBgYHtyIGZpZy53aWR0aCA9IDIuNSwgZmlnLmhlaWdodCA9IDMsIG91dC5oZWlnaHQ9IjUwJSJ9CmRlc2Vhc29uZWRfYWxsX2NpdHl3aWRlICU+JQogIGZpbHRlcihncmVwbCgiUk9CQkVSWSIsIGRlc2NyaXB0aW9uKSwKICAgICAgICAgZGVzY3JpcHRpb24gIT0gIlJPQkJFUlkgKEFMTCkiLAogICAgICAgICBjcmltZWRhdGUgPj0gIjIwMTktMDEtMDEiKSAlPiUKICBnZ3Bsb3QoYWVzKGNyaW1lZGF0ZSkpICsKICBnZW9tX3JlY3QoYWVzKHhtaW49bWRfc3RheV9hdF9ob21lX3N0YXJ0LCB4bWF4PW1kX3N0YXlfYXRfaG9tZV9lbmQsIHltaW49MCwgeW1heD1JbmYpLAogICAgICAgICAgICBmaWxsID0gImdyYXk5MCIsIGFscGhhID0gMC41KSArCiAgZ2VvbV9saW5lKGFlcyh5PWRlc2Vhc29uZWRfOTBkLCBjb2xvciA9IGRlc2NyaXB0aW9uKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IC4gJT4lIAogICAgICAgICAgICAgICBmaWx0ZXIoY3JpbWVkYXRlID09IG1heChjcmltZWRhdGUpIC0gMzY1KSwgCiAgICAgICAgICAgICBhZXMoeCA9IGNyaW1lZGF0ZSwgeSA9IGRlc2Vhc29uZWRfOTBkKSwKICAgICAgICAgICAgIGNvbG9yID0gaXRlYW0uY29sb3JzWzFdLCBzaXplID0gMykgKwogIGdlb21fcG9pbnQoZGF0YSA9IC4gJT4lIAogICAgICAgICAgICAgICBmaWx0ZXIoY3JpbWVkYXRlID09IG1heChjcmltZWRhdGUpKSwgCiAgICAgICAgICAgICBhZXMoeCA9IGNyaW1lZGF0ZSwgeSA9IHJvbGxfOTApLAogICAgICAgICAgICAgY29sb3IgPSByZWRfb3JhbmdlLCBzaXplID0gMykgKwogIGZhY2V0X3dyYXAobmNvbCA9IDEsIH5kZXNjcmlwdGlvbiwgc2NhbGVzPSJmcmVlX3kiKSArCiAgdGhlbWVfaXRlYW1fcHJlc2VudGF0aW9ucygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXk5MCIpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGVfaXRlYW0oKSArCiAgICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSB5ZWFyIiwgZGF0ZV9sYWJlbHMgPSBmb3JtYXQoIiVZIiksCiAgICAgICAgICAgICAgIGRhdGVfbWlub3JfYnJlYWtzID0gIjEgbW9udGgiKSArCiAgI2xhYnModGl0bGUgPSAiQWN0dWFsIDkwLURheSBDcmltZSBUcmVuZHMiKSArCiAgbGFicyh5ID0gIjkwIERheSBSb2xsaW5nIFRvdGFsIikKYGBgCgpgYGB7ciBmaWcud2lkdGggPSAyLjUsIGZpZy5oZWlnaHQgPSAzLCBvdXQuaGVpZ2h0PSI1MCUifQpkZXNlYXNvbmVkX2FsbF9jaXR5d2lkZSAlPiUKICBmaWx0ZXIoZ3JlcGwoIlJPQkJFUlkiLCBkZXNjcmlwdGlvbiksCiAgICAgICAgIGRlc2NyaXB0aW9uICE9ICJST0JCRVJZIChBTEwpIiwKICAgICAgICAgY3JpbWVkYXRlID49ICIyMDE5LTAxLTAxIikgJT4lCiAgZ2dwbG90KGFlcyhjcmltZWRhdGUpKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluPW1kX3N0YXlfYXRfaG9tZV9zdGFydCwgeG1heD1tZF9zdGF5X2F0X2hvbWVfZW5kLCB5bWluPTAsIHltYXg9SW5mKSwKICAgICAgICAgICAgZmlsbCA9ICJncmF5OTAiLCBhbHBoYSA9IDAuNSkgKwogIGdlb21fbGluZShhZXMoeT1yb2xsXzkwLCBjb2xvciA9IGRlc2NyaXB0aW9uKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IC4gJT4lIAogICAgICAgICAgICAgICBmaWx0ZXIoY3JpbWVkYXRlID09IG1heChjcmltZWRhdGUpIC0gMzY1KSwgCiAgICAgICAgICAgICBhZXMoeCA9IGNyaW1lZGF0ZSwgeSA9IHJvbGxfOTApLAogICAgICAgICAgICAgY29sb3IgPSBpdGVhbS5jb2xvcnNbMV0sIHNpemUgPSAzKSArCiAgZ2VvbV9wb2ludChkYXRhID0gLiAlPiUgCiAgICAgICAgICAgICAgIGZpbHRlcihjcmltZWRhdGUgPT0gbWF4KGNyaW1lZGF0ZSkpLCAKICAgICAgICAgICAgIGFlcyh4ID0gY3JpbWVkYXRlLCB5ID0gcm9sbF85MCksCiAgICAgICAgICAgICBjb2xvciA9IHJlZF9vcmFuZ2UsIHNpemUgPSAzKSArCiAgZmFjZXRfd3JhcChuY29sID0gMSwgfmRlc2NyaXB0aW9uLCBzY2FsZXM9ImZyZWVfeSIpICsKICB0aGVtZV9pdGVhbV9wcmVzZW50YXRpb25zKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTkwIikpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZV9pdGVhbSgpICsKICAgICAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgeWVhciIsIGRhdGVfbGFiZWxzID0gZm9ybWF0KCIlWSIpLAogICAgICAgICAgICAgICBkYXRlX21pbm9yX2JyZWFrcyA9ICIxIG1vbnRoIikgKwogICNsYWJzKHRpdGxlID0gIkFjdHVhbCA5MC1EYXkgQ3JpbWUgVHJlbmRzIikgKwogIGxhYnMoeSA9ICI5MCBEYXkgUm9sbGluZyBUb3RhbCIpCmBgYAoKCgoKYGBge3IgZmlnLndpZHRoID0gMy41LCBmaWcuaGVpZ2h0ID0gMiwgb3V0LmhlaWdodD0iMTAwJSJ9CmRlc2Vhc29uZWRfYWxsX2NpdHl3aWRlICU+JQogIGZpbHRlcihncmVwbCgiUk9CQkVSWSIsIGRlc2NyaXB0aW9uKSwKICAgICAgICAgZGVzY3JpcHRpb24gIT0gIlJPQkJFUlkgKEFMTCkiLAogICAgICAgICBjcmltZWRhdGUgPj0gIjIwMTktMDEtMDEiKSAlPiUKICBnZ3Bsb3QoYWVzKGNyaW1lZGF0ZSkpICsKICBnZW9tX3JlY3QoYWVzKHhtaW49bWRfc3RheV9hdF9ob21lX3N0YXJ0LCB4bWF4PW1kX3N0YXlfYXRfaG9tZV9lbmQsIHltaW49MCwgeW1heD1JbmYpLAogICAgICAgICAgICBmaWxsID0gImdyYXk5MCIsIGFscGhhID0gMC41KSArCiAgZ2VvbV9saW5lKGFlcyh5PXJvbGxfOTAsIGNvbG9yID0gZGVzY3JpcHRpb24pLAogICAgICAgICAgICBzaXplID0gMS4pICsKICAjZmFjZXRfd3JhcChuY29sID0gMSwgfmRlc2NyaXB0aW9uKSArCiAgeWxpbShjKDAsIDEyMDApKSArCiAgdGhlbWVfaXRlYW1fcHJlc2VudGF0aW9ucygpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZV9pdGVhbSgpICsKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXk3MCIpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5OTAiKSkgKwogICNsYWJzKHRpdGxlID0gIlNlYXNvbmFsbHkgQWRqdXN0ZWQgOTAtRGF5IENyaW1lIFRyZW5kcyIpICsKICBsYWJzKHkgPSAiOTAgRGF5IFJvbGxpbmcgVG90YWwiKSArCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgeWVhciIsIGRhdGVfbGFiZWxzID0gZm9ybWF0KCIlWSIpLAogICAgICAgICAgICAgICBkYXRlX21pbm9yX2JyZWFrcyA9ICIxIG1vbnRoIikKYGBgCgpgYGB7ciBmaWcud2lkdGggPSA2LCBmaWcuaGVpZ2h0ID0gNiwgb3V0LmhlaWdodD0iMTAwJSIsIG91dC53aWR0aCA9ICIxMDAlIn0KIyBUSElTIE9ORSBTSE9VTEQgQkUgVEhFIEZVTkNUSU9OCmRlc2Vhc29uZWRfYWxsX2J5X2Rpc3RyaWN0ICU+JQogIGZpbHRlcihkZXNjcmlwdGlvbiA9PSAiSE9NSUNJREUgKyBTSE9PVElORyIsCiAgICAgICAgIGNyaW1lZGF0ZSA+PSAiMjAxOS0wMS0wMSIpICU+JQogIGdncGxvdChhZXMoY3JpbWVkYXRlKSkgKwogICAgZ2VvbV9yZWN0KGFlcyh4bWluPW1kX3N0YXlfYXRfaG9tZV9zdGFydCwgeG1heD1tZF9zdGF5X2F0X2hvbWVfZW5kLCB5bWluPTAsIHltYXg9SW5mKSwKICAgICAgICAgICAgICBmaWxsID0gImdyYXk5MCIsIGFscGhhID0gMC41KSArCiAgZ2VvbV9saW5lKGFlcyh5PWRlc2Vhc29uZWRfOTBkKSwgIGNvbG9yID0gaXRlYW0uY29sb3JzWzJdKSArCiAgZ2VvbV9wb2ludChkYXRhID0gLiAlPiUgCiAgICAgICAgICAgICAgIGZpbHRlcihjcmltZWRhdGUgPT0gbWF4KGNyaW1lZGF0ZSkgLSAzNjUpLCAKICAgICAgICAgICAgIGFlcyh4ID0gY3JpbWVkYXRlLCB5ID0gZGVzZWFzb25lZF85MGQpLAogICAgICAgICAgICAgY29sb3IgPSBpdGVhbS5jb2xvcnNbMV0sIHNpemUgPSAzKSArCiAgZ2VvbV9wb2ludChkYXRhID0gLiAlPiUgCiAgICAgICAgICAgICAgIGZpbHRlcihjcmltZWRhdGUgPT0gbWF4KGNyaW1lZGF0ZSkpLCAKICAgICAgICAgICAgIGFlcyh4ID0gY3JpbWVkYXRlLCB5ID0gZGVzZWFzb25lZF85MGQpLAogICAgICAgICAgICAgY29sb3IgPSByZWRfb3JhbmdlLCBzaXplID0gMykgKwogIGZhY2V0X3dyYXAoIH5kZXNjcmlwdGlvbiArIGRpc3RyaWN0LCBzY2FsZXMgPSAiZnJlZV95IikgKwogIHRoZW1lX2l0ZWFtX3ByZXNlbnRhdGlvbnMoKSArCiAgI3NjYWxlX2NvbG9yX2Rpc2NyZXRlX2l0ZWFtKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXk5MCIpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnModGl0bGUgPSAiU2Vhc29uYWxseSBBZGp1c3RlZCA5MC1EYXkgQ3JpbWUgVHJlbmRzIikgKwogIGxhYnMoeSA9ICI5MCBEYXkgUm9sbGluZyBUb3RhbCIpICsKICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSB5ZWFyIiwgZGF0ZV9sYWJlbHMgPSBmb3JtYXQoIiVZIiksCiAgICAgICAgICAgICAgIGRhdGVfbWlub3JfYnJlYWtzID0gIjEgbW9udGgiKSAKYGBgCgoKCmBgYHtyfQp2aW9sZW50X2NyaW1lICU+JQogIGZpbHRlcihkZXNjcmlwdGlvbiAhPSAiUk9CQkVSWSAoQUxMKSIsCiAgICAgICAgIGdyZXBsKCJST0JCRVJZIiwgZGVzY3JpcHRpb24pLAogICAgICAgICB5ZWFyKGNyaW1lZGF0ZSkgPT0gMjAyMCkgJT4lCiAgY291bnQoZGVzY3JpcHRpb24pCiAgCmBgYAoK